//#include<iostream>
//#include<vector>
//#include<list>
//#include<queue>
//#include<stack>
//#include<algorithm>
//using namespace std;
//
//struct ListNode {
//    int val;
//    struct ListNode* next;
//    ListNode(int x) : val(x), next(nullptr) {}
//};
// 
//class Solution {
//public:
//    ListNode* mergeKLists(vector<ListNode*>& lists) {
//        vector<int> v;
//        for (auto& e : lists)
//        {
//            while (e)
//            {
//                v.push_back(e->val);
//                e = e->next;
//            }
//        }
//        sort(v.begin(), v.end());
//        if (v.size() == 0) return nullptr;
//
//        ListNode* head = new ListNode(v[0]);
//        ListNode* cur = head;
//        for (int i = 1; i < v.size(); ++i)
//        {
//            ListNode* newnode = new ListNode(v[i]);
//            cur->next = newnode;
//            cur = cur->next;
//        }
//        return head;
//    }
//};

#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <algorithm>
using namespace std;
int n, l, r;

int main()
{
    cin >> n >> l >> r;
    vector<int> v(n);
    for (int i = 0; i < n; i++)
    {
        cin >> v[i];
    }
    sort(v.begin(), v.end());
    int left = 0, right = 1, ret = 0;
    while (left < n && right < n)
    {
        int dis = v[right] - v[left];
        if (dis >= l && dis <= r)
        {
            ret++;
            right++;
        }
        else if (dis > r)
        {
            left++;
        }
        else if (dis < l) {
            right++;
        }
    }
    cout << ret << endl;
    return 0;
}